📅 2021. 04. 30
🙍♂️ 박서진님 - https://github.com/raon0211
웹 서비스에서 가장 다루기 어려운 부분은? 비동기 프로그래밍
👎 읽기 어려운 코드의 특징
'성공하는 경우'와 '실패하는 경우'가 섞여있음 -> 함수의 크기가 커져 비즈니스 로직이 파악이 어려워짐
👍 읽기 쉬운 코드의 특징
try
, catch
안에 async
, await
를 넣어서 처리하는 케이스가 대표적
컴포넌트에서 로딩과 에러 처리를 동시에 수행함
하나의 비동기 작업은 로딩
, 에러
, 완료
3가지의 상태를 가짐. 만약 2개의 비동기 작업을 요청하는 경우 9가지의 상태를 가짐.
-> 비동기 작업이 많아질수록 복잡성이 늘어남 😭
-> try
, catch
구문과 거의 유사한 구조를 가지고 있는 모습을 확인할 수 있음
Recoil에선 Async Selector
를 사용,
SWR, React Query에선 {suspense: true}
를 사용하면 자동으로 컴포넌트의 suspense 상태가 관리됨
🙍♂️ 이한님 - https://github.com/hahnlee
페이지 로딩 2초 이내 로드시 이탈율 9%, 5초 초과시 이탈율 38%
바이트별로 보면, 자바스크립트는 같은 크기의 이미지나 웹폰트보다 브라우저가 처리하는 비용이 많이 듭니다. - Tom Dale
JavaScript는 파일을 다운로드한 후 파싱, 컴파일, 실행까지 여러 단계를 거치기 때문에 같은 용량이더라도 처리비용이 높음. 따라서 번들 최적화가 아주 중요함.
1. ✨ 원인 찾기 - Webpack Bundle Analyzer 추천
용량이 큰 라이브러리는 더 가벼운 라이브러리로 대체하고 용도가 겹치는 라이브러리는 하나의 라이브러리로 통일하자.
2. ✨ 라이브러리 중복 줄이기
같은 라이브러리지만 버전이 다른 경우가 존재 (Dependency conflict) 패키지 매니저마다 이 문제를 다양한 방식으로 해결
2-1. npm은 어떻게 Dependency conflict를 해결했나
npm은 tree 구조로 필요한 버전을 모두 다운로드함
-> 디펜던시를 작성자가 의도한 버전대로 동작하는 효과
-> but, 번들 사이즈와 node_modules
용량이 커짐
npm은 node_modules
용량이 과도하게 커지는 문제를 해결하기 위해 더 높은 버전을 사용
-> 라이브러리들이 semver를 지킨다고 가정하기 때문에 메이저 버전이 바뀌지 않는 한 문제가 없다고 판단
npm dedupe
: 중복된 모듈을 줄일 수 있는 명령어
-> 중복된 라이브러리의 버전을 확인하고 적합한 버전으로 통합
2-2. yarn은 어떻게 Dependency conflict를 해결했나
The dedupe command isn’t necessary. yarn install will already dedupe.
이미 yarn install
이 dedupe을 알아서 한다고 함. 근데 완벽하지 않음. 😅
yarn-deduplicate 라이브러리를 사용해서 중복된 라이브러리 제거를 추천.
2-3. yarn2
는 npm처럼 yarn dedupe
을 지원함
2-4. 라이브러리 중복의 쉬운 예시는 lodash
가 있음
lodash
의 문제는 cjs 버전의 lodash
, esm 버전의 lodash-es
, 단독 라이브러리 형태의 lodash.get
등 같은 패키지가 여러 패키지로 존재
-> 프로젝트에서 lodash
패키지 하나만 쓰고 있더라도 디펜던시 때문에 여러개의 lodash
가 설치될수 있음.
webpack의 alias
옵션으로 해결가능
3. ✨ 필요한 라이브러리만 불러오기
위의 코드는 아래와 같이 변환됨.
-> merge
함수 하나를 위해 lodash 전체를 로드함 😱
이렇게 필요한 라이브러리만 불러오면 용량을 줄일 수 있다.
...언제 다 바꾸죠? 😫
babel-plugin-transform-imports 사용하면 트랜스파일러가 알아서 바꿔줌!
4. ✨ 더 가벼운 라이브러리 사용하기
lodash의 groupBy
는 함수 하나가 무려 6kb. shorthands 표현, 캐싱등을 지원하기 때문. -> 직접 구현하자
node-rsa는 Node.js용으로 만들어진 라이브러리라서 crypto
, Buffer
, Big Number
등의 polyfill 용량만 100kb 😱 -> webpack 설정으로 끄자
🙍♀️ 진유림님 - https://github.com/milooy/
"그 코드는 안 건드리시는게 좋을 거에요. 일단 제가 만질게요. ^^;;" -> 동료에게 물어봐야 알수 있는 코드는 개발 병목과 유지보수 시간을 연장시킴
실무에서 클린코드의 의의 = 유지보수 시간의 단축
-> 코드 파악, 디버깅, 리뷰 시간을 단축시킴
하나의 목적을 가진 코드가 흩뿌려져 있어요
-> 같은 목적의 코드는 뭉쳐두자
뭉치면 쾌적한 코드와 답답한 코드 구분하기
클린 코드는 짧은 코드가 아니라 찾고 싶은 로직을 빠르게 찾을 수 있는 코드
함수가 여러가지 일을 하고 있어요
-> 하나의 일을 하는 뚜렷한 이름의 함수를 만들자
함수의 세부구현 단계가 제각각이에요
-> 핵심 개념을 뽑아내자
🙍♂️ 조유성님 - https://github.com/g6123
25개의 서비스는 서로 다른 webpack entrypoint를 가지지만, 하나의 package.json
에서 빌드를 함. 이는 다음과 같은 문제가 생김.
패키지 하나 업데이트 했을 뿐인데 25개 서비스 중 일부 서비스에서 에러가 뿜뿜해버림
코드 한 줄만 수정해도 모든 빌드를 새로 해야함
패키지를 세 가지로 분리하여 구성
"Zero-Build" -> 소스 코드가 바뀐 패키지만 빌드하고 나머지는 기존 빌드 결과물을 재사용하기!
Git 커밋 해쉬 비교
Git 저장소에 gzip
으로 압축해서 저장
결과적으로 빌드 속도가 최대 15배 향상함